package com.ruoyi.project.sell.order.controller;

import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.project.sell.order.domain.SellOrder;
import com.ruoyi.project.sell.order.service.ISellOrderService;
import com.ruoyi.project.system.post.domain.Post;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author syb date 2020/9/18
 */
@Controller
@RequestMapping("/sell/order")
public class SellOrderController extends BaseController {

  //声明资源地址的公共前缀
  private String prefix="sell/order";

  @Autowired
  private ISellOrderService sellOrderService;

  /**
   * 跳转订单管理页面
   * @return 跳转到类型的主页
   */
  @RequiresPermissions("sell:order:view")
  @GetMapping()
  public String  sellOrder(){
    return prefix+"/order";
  }

  /**
   * 分页加载订单管理
   * @param sellOrder
   * @return
   */
  @RequiresPermissions("sell:order:list") //校验此次发起的请求是否具有分页查看公共的权限
  @PostMapping("/list") //请求地址
  @ResponseBody //设置单元方法的返回值即为响应的数据，ajax响应
  public TableDataInfo list(SellOrder sellOrder){
    //声明实体类形参接收请求数据，但是只接收分页条件以外的数据

    /**
     * 1.该方法底层调用PageHelper分页插件，自定完成分页查询的相关设置以及分页Sql语句的拼接
     * 也就是会自动的在我们声明的查询公告类型的Sql语句后拼接limit关键字
     * 2.startPage方法的底层会自动的调用HttpServletRequest对象获取此次分页请求中的
     *  分页条件，pageNum和pageSize。
     *
     */
    startPage();
    /**
     * 调用业务层完成分页查询，并获取分页结果
     */
    List<SellOrder> list = sellOrderService.selectSellOrderList(sellOrder); //查看公告类型
    /**
     * getDataTable方法将存储了分页结果的集合转换为TableDataInfo对象并返回
     * 然后响应给前台。
     * 注意：
     *  前台页面中接收的是TableDataInfo对象的json数据，不是list集合，相当于    EasyUI的DataGrid
     *  的方式，DataGrid接收的是PageResult，只不过以前PageResult是我们自己声明，现在在若依
     *  项目中已经提前声明好了。
     *
     */
    System.out.println("list:"+list);
    return getDataTable(list);
  }

  /**
   * 校验项目名称
   */
  @PostMapping("/checkSellOrderNameUnique")
  @ResponseBody
  public String checkPostNameUnique(SellOrder sellOrder)
  {
    return sellOrderService.checkSellOrderNameUnique(sellOrder);
  }

  /**
   * 新增保存销售类型
   */
  @RequiresPermissions("sell:order:add")
  @Log(title = "销售管理", businessType = BusinessType.INSERT)
  @PostMapping("/add")
  @ResponseBody
  public AjaxResult addSave(@Validated SellOrder sellOrder)
  {
    if (UserConstants.SELL_ORDER_NAME_NOT_UNIQUE.equals(sellOrderService.checkSellOrderNameUnique(sellOrder)))
    {
      return error("新增销售订单'" + sellOrder.getSellOrderName() + "'失败，订单名称已存在");
    }

    return toAjax(sellOrderService.insertSellOrder(sellOrder));
  }

  @RequestMapping("/add")
  public String add(){
    return prefix + "/add";
  }

  /**
   * 修改销售订单类型
   */
  @GetMapping("/edit/{sellOrderId}")
  public String edit(@PathVariable("sellOrderId") Long sellOrderId, ModelMap map)
  {
    map.put("sell", sellOrderService.selectSellOrderById(sellOrderId));
    return prefix + "/edit";
  }

  /**
   * 修改保存销售管理
   */
  @RequiresPermissions("sell:order:edit")
  @Log(title = "销售管理", businessType = BusinessType.UPDATE)
  @PostMapping("/edit")
  @ResponseBody
  public AjaxResult editSave(@Validated SellOrder sellOrder)
  {
    if (UserConstants.POST_NAME_NOT_UNIQUE.equals(sellOrderService.checkSellOrderNameUnique(sellOrder)))
    {
      return error("修改销售管理'" + sellOrder.getSellOrderName()+ "'失败，项目名称已存在");
    }
    return toAjax(sellOrderService.updateSellOrder(sellOrder));
  }

  /**
   * 删除销售管理
   */
  @RequiresPermissions("sell:order:remove")
  @Log(title = "销售管理", businessType = BusinessType.DELETE)
  @PostMapping("/remove")
  @ResponseBody
  public AjaxResult remove(String ids)
  {
    try
    {
      return toAjax(sellOrderService.deleteSellOrderIds(ids));
    }
    catch (Exception e)
    {
      return error(e.getMessage());
    }
  }

}
